package com.cskaoyan.javase._1interface._4example.controller.impl;

import com.cskaoyan.javase._1interface._4example.controller.IGoodsController;
import com.cskaoyan.javase._1interface._4example.dao.IGoodsDao;
import com.cskaoyan.javase._1interface._4example.dao.impl.IGoodsDaoImpl;
import com.cskaoyan.javase._1interface._4example.model.Goods;

/**
 * 商品操作的实现类,该层对外提供业务操作服务
 * 该层不做数据处理,仅做业务处理
 *
 * @since 11:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsControllerImpl implements IGoodsController {

    // 依赖于dao层对象,完成数据处理
    /*
        这里的细节:
            是用子类引用指向子类对象
            还是用父类引用指向子类对象
        应该用父类引用
        因为接口起着标准和规范的作用
        所有不在接口中定义的方法,都不应该被调用
     */
    private IGoodsDao ig = new IGoodsDaoImpl();

    /**
     * 返回所有的真实商品对象数组
     * @return com.cskaoyan.javase._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/17 11:46
     */
    @Override
    public Goods[] getAllRealGoods() {
        // 返回所有的真实商品对象数组,这其实就是一个单纯的数据处理,没有业务处理
        // 所以直接依赖于dao对象完成数据操作即可
        return ig.getAllRealGoods();
    }

    /**
     * 方法的返回值代码:
     *      a.id重复了,插入失败 返回1
     *      b.数组没有null的位置了,数组满了,插入失败 返回2
     *      c.以上情况都没碰到,插入成功 返回3
     *
     * @param id 被插入商品的id
     * @param name 被插入商品的name
     * @param brand 被插入商品的brand
     * @param price 被插入商品的price
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/06/17 14:36
     */
    @Override
    public int insertGoods(int id, String name, String brand, double price) {
        // 1.封装商品对象
        Goods goodsInsert = new Goods(id, name, brand, price);
        /*
            可以选择偷懒点:
                 直接找dao对象完成插入操作
            也可以更具体一点:
                 a.先判断id是否重复
                 b.不重复去考虑插入,返回插入的结果
          */
        if (ig.judgeIdExist(id)) {
            // 规定 存在返回true,不存在返回false
            // 存在就意味着重复,重复该方法返回1
            return 1;
        }
        // 代码运行到这里,id肯定不重复了,开始考虑插入
        if (ig.insertGoodsIdNotDuplicated(goodsInsert)){
            // 规定 有空间能够插入成功返回true,否则数组满了插入失败,返回false
            return 3;
        }
        // 上面没有结束方法,说明数组满了
        return 2;
    }
}
